SnowflakeのMasking Policyを共通データベース・スキーマで作成して適用できるか確認してみた
さがらです。
小ネタ寄りですが、SnowflakeのMasking Policyを共通データベース・スキーマで作成して適用できるかを確認してみたので、内容をまとめてみます。
結論
SnowflakeのMasking Policyを共通データベース・スキーマで作成して、実際にクエリ対象となる別のデータベース・スキーマのテーブルにMasking Policyを適用することはできます!
また、Masking Policyの条件文に入れているロールに対して、Masking Policyを管理している共通データベース・スキーマに対するUSAGE
権限も不要です!
試してみた
下記のcustomers
テーブルのfirst_name
カラムに対して、別の共通データベース・スキーマで作成したMasking Policyを適用することを考えてみます。
まず、下記のクエリを実行して、Masking Policyを保存する共通のデータベース・スキーマを作成します。
use role sysadmin;
create database sagara_common_objects_db;
grant ownership on database sagara_common_objects_db to role sagara_admin_role;
use role sagara_admin_role;
use database sagara_common_objects_db;
create schema sagara_common_objects_db.masking_policies;
Masking Policyを適用するために必要な権限を付与します
use role accountadmin;
use database sagara_common_objects_db;
grant create masking policy on schema masking_policies to role sagara_admin_role; -- 本検証では元々スキーマのownershipがあるためなくてもよいが参考として
grant apply masking policy on account to role sagara_admin_role;
共通のデータベース・スキーマにMasking Policyを作成し、対象テーブルのカラムに適用します。
use role sagara_admin_role;
use database sagara_common_objects_db;
use schema masking_policies;
create or replace masking policy first_name_mask as (val string) returns string ->
case
when current_role() in ('SAGARA_ADMIN_ROLE') then val
else '*********'
end;
use database sagara_rawdata_db;
use schema jaffle_shop;
alter table if exists customers modify column first_name set masking policy sagara_common_objects_db.masking_policies.first_name_mask;
この状態で、Masking Policyの条件に合致しないsagara_dev_role
からクエリを発行してみます。
すると、マスキングが適用されていました!
use role sagara_dev_role;
select * from customers;
下図のように、sagara_dev_role
にはMasking Policyを保存している共通データベースとスキーマに対してUSAGEも付与されていませんが、問題なくマスキングできました。
最後に
SnowflakeのMasking Policyを共通データベース・スキーマで作成して、実際にクエリ対象となる別のデータベース・スキーマのテーブルにMasking Policyを適用できることを確認してみました。その際にクエリを発行するロールに共通データベース・スキーマに対するUSAGE
権限も不要であることも確認できました。
特にUSAGE
が必要かどうかが気になっていたのですが、不要であることがわかって安心しました!